पायथन पैकेज प्रबंधन के लिए setup.py और pyproject.toml की गहन तुलना, सर्वोत्तम प्रथाओं, माइग्रेशन रणनीतियों और आधुनिक उपकरणों को कवर करती है।
पायथन पैकेज संरचना: Setup.py बनाम Pyproject.toml - एक व्यापक गाइड
सालों से, setup.py
फ़ाइल पायथन पैकेज प्रबंधन की आधारशिला थी। हालाँकि, परिदृश्य विकसित हुआ है, और pyproject.toml
एक आधुनिक विकल्प के रूप में उभरा है। यह व्यापक गाइड इन दोनों दृष्टिकोणों के बीच के अंतर का पता लगाता है, जिससे आपको यह समझने में मदद मिलती है कि आपके प्रोजेक्ट के लिए कौन सा सही है और आप अपने पायथन पैकेजों को प्रभावी ढंग से कैसे प्रबंधित कर सकते हैं।
मूल बातें समझना
पायथन पैकेज क्या है?
एक पायथन पैकेज आपके पायथन कोड को व्यवस्थित और वितरित करने का एक तरीका है। यह आपको संबंधित मॉड्यूल को एक निर्देशिका पदानुक्रम में समूहित करने की अनुमति देता है, जिससे आपका कोड अधिक मॉड्यूलर, पुन: प्रयोज्य और बनाए रखने योग्य हो जाता है। आपके कोड को दूसरों के साथ साझा करने और आपके प्रोजेक्ट में निर्भरता प्रबंधित करने के लिए पैकेज आवश्यक हैं।
पैकेज मेटाडेटा की भूमिका
पैकेज मेटाडेटा आपके पैकेज के बारे में आवश्यक जानकारी प्रदान करता है, जैसे कि इसका नाम, संस्करण, लेखक, निर्भरताएँ और प्रवेश बिंदु। इस मेटाडेटा का उपयोग pip
जैसे पैकेज प्रबंधकों द्वारा आपके पैकेजों को स्थापित, अपग्रेड और प्रबंधित करने के लिए किया जाता है। ऐतिहासिक रूप से, setup.py
इस मेटाडेटा को परिभाषित करने का प्राथमिक तरीका था।
Setup.py: पारंपरिक दृष्टिकोण
Setup.py क्या है?
setup.py
एक पायथन स्क्रिप्ट है जो आपके पैकेज की संरचना और मेटाडेटा को परिभाषित करने के लिए setuptools
लाइब्रेरी का उपयोग करती है। यह एक गतिशील रूप से निष्पादित फ़ाइल है, जिसका अर्थ है कि यह पैकेज को कॉन्फ़िगर करने के लिए पायथन कोड चलाता है।
Setup.py के मुख्य घटक
एक विशिष्ट setup.py
फ़ाइल में निम्नलिखित घटक शामिल हैं:
- पैकेज का नाम: आपके पैकेज का नाम (जैसे,
my_package
)। - संस्करण: आपके पैकेज का संस्करण नंबर (जैसे,
1.0.0
)। - लेखक और अनुरक्षक जानकारी: पैकेज के लेखक और अनुरक्षक के बारे में विवरण।
- निर्भरताएँ: अन्य पैकेजों की एक सूची जिन पर आपका पैकेज निर्भर करता है (जैसे,
requests >= 2.20.0
)। - प्रवेश बिंदु: कमांड-लाइन स्क्रिप्ट या आपके पैकेज में अन्य प्रवेश बिंदुओं के लिए परिभाषाएँ।
- पैकेज डेटा: गैर-कोड फ़ाइलें (जैसे, कॉन्फ़िगरेशन फ़ाइलें, डेटा फ़ाइलें) जिन्हें पैकेज में शामिल किया जाना चाहिए।
Setup.py का उदाहरण
```python from setuptools import setup, find_packages setup( name='my_package', version='1.0.0', author='जॉन डो', author_email='john.doe@example.com', description='एक साधारण पायथन पैकेज', packages=find_packages(), install_requires=[ 'requests >= 2.20.0', ], entry_points={ 'console_scripts': [ 'my_script = my_package.module:main', ], }, classifiers=[ 'Programming Language :: Python :: 3', 'License :: OSI Approved :: MIT License', 'Operating System :: OS Independent', ], ) ```Setup.py के फायदे
- परिचितता: यह पारंपरिक और अच्छी तरह से ज्ञात दृष्टिकोण है, इसलिए कई डेवलपर पहले से ही इससे परिचित हैं।
- लचीलापन: क्योंकि यह एक पायथन स्क्रिप्ट है, यह उच्च स्तर का लचीलापन प्रदान करता है। आप जटिल तर्क कर सकते हैं और आवश्यकतानुसार बिल्ड प्रक्रिया को अनुकूलित कर सकते हैं।
- विस्तारणीयता: Setuptools सुविधाओं का एक समृद्ध सेट प्रदान करता है और इसे कस्टम कमांड और एक्सटेंशन के साथ बढ़ाया जा सकता है।
Setup.py के नुकसान
- गतिशील निष्पादन:
setup.py
की गतिशील प्रकृति एक सुरक्षा जोखिम हो सकती है, क्योंकि यह बिल्ड प्रक्रिया के दौरान मनमाना कोड निष्पादित करता है। - निहित निर्भरताएँ:
setup.py
अक्सर निहित निर्भरताओं पर निर्भर करता है, जैसे कि सेटuptools स्वयं, जिससे असंगतताएँ और त्रुटियाँ हो सकती हैं। - जटिलता: जटिल परियोजनाओं के लिए,
setup.py
बड़ी और बनाए रखने में मुश्किल हो सकती है। - सीमित घोषणात्मक कॉन्फ़िगरेशन: पैकेज मेटाडेटा का अधिकांश भाग अनिवार्य रूप से परिभाषित किया गया है न कि घोषणात्मक रूप से, जिससे इसके बारे में तर्क करना कठिन हो जाता है।
Pyproject.toml: आधुनिक विकल्प
Pyproject.toml क्या है?
pyproject.toml
एक कॉन्फ़िगरेशन फ़ाइल है जो आपके पैकेज के बिल्ड सिस्टम और मेटाडेटा को परिभाषित करने के लिए TOML (टॉम्स ऑब्वियस, मिनिमल लैंग्वेज) प्रारूप का उपयोग करती है। यह एक घोषणात्मक दृष्टिकोण है, जिसका अर्थ है कि आप यह निर्दिष्ट करते हैं कि आप क्या हासिल करना चाहते हैं, न कि इसे कैसे हासिल करना है।
Pyproject.toml के मुख्य भाग
एक विशिष्टpyproject.toml
फ़ाइल में निम्नलिखित भाग शामिल हैं:
[build-system]
: उपयोग करने के लिए बिल्ड सिस्टम को परिभाषित करता है (जैसे,setuptools
,poetry
,flit
)।[project]
: प्रोजेक्ट के बारे में मेटाडेटा शामिल है, जैसे कि इसका नाम, संस्करण, विवरण, लेखक और निर्भरताएँ।[tool.poetry]
या[tool.flit]
: उपकरण-विशिष्ट कॉन्फ़िगरेशन के लिए अनुभाग (जैसे, पोएट्री, फ्लिट)।
Pyproject.toml का उदाहरण (Setuptools के साथ)
```toml [build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my_package" version = "1.0.0" description = "एक साधारण पायथन पैकेज" authors = [ { name = "जॉन डो", email = "john.doe@example.com" } ] dependencies = [ "requests >= 2.20.0", ] [project.scripts] my_script = "my_package.module:main" [project.optional-dependencies] dev = [ "pytest", "flake8", ] [project.classifiers] classifiers = [ "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] [project.urls] homepage = "https://example.com" repository = "https://github.com/example/my_package" ```Pyproject.toml का उदाहरण (Poetry के साथ)
```toml [tool.poetry] name = "my_package" version = "1.0.0" description = "एक साधारण पायथन पैकेज" authors = ["जॉन डोPyproject.toml के फायदे
- घोषणात्मक कॉन्फ़िगरेशन:
pyproject.toml
आपके पैकेज मेटाडेटा को परिभाषित करने का एक घोषणात्मक तरीका प्रदान करता है, जिससे इसे समझना और बनाए रखना आसान हो जाता है। - मानकीकृत बिल्ड सिस्टम: यह उपयोग करने के लिए बिल्ड सिस्टम को निर्दिष्ट करता है, जिससे विभिन्न वातावरणों में लगातार बिल्ड सुनिश्चित होते हैं।
- बेहतर निर्भरता प्रबंधन: मजबूत निर्भरता प्रबंधन सुविधाएँ प्रदान करने के लिए Poetry और Pipenv जैसे उपकरण
pyproject.toml
के साथ निर्बाध रूप से एकीकृत होते हैं। - कम सुरक्षा जोखिम: क्योंकि यह एक स्थिर कॉन्फ़िगरेशन फ़ाइल है, यह बिल्ड प्रक्रिया के दौरान गतिशील रूप से कोड निष्पादित करने से जुड़े सुरक्षा जोखिमों को समाप्त करता है।
- आधुनिक उपकरणों के साथ एकीकरण:
pyproject.toml
पोएट्री, पिपेनव और फ्लिट जैसे आधुनिक पायथन पैकेजिंग उपकरणों के लिए मानक है।
Pyproject.toml के नुकसान
- सीखने की अवस्था: डेवलपर्स को एक नई सिंटैक्स (TOML) और पैकेज प्रबंधन के बारे में सोचने के एक नए तरीके को सीखने की आवश्यकता हो सकती है।
- सीमित लचीलापन: यह अत्यधिक अनुकूलित बिल्ड प्रक्रियाओं के लिए उपयुक्त नहीं हो सकता है जिनके लिए जटिल तर्क की आवश्यकता होती है।
- उपकरण निर्भरता: आपको एक विशिष्ट बिल्ड सिस्टम (जैसे, Setuptools, Poetry, Flit) को चुनना और उपयोग करना सीखना होगा।
Setup.py और Pyproject.toml की तुलना
यहाँ setup.py
और pyproject.toml
के बीच मुख्य अंतरों का सारांश देने वाली एक तालिका दी गई है:
विशेषता | Setup.py | Pyproject.toml |
---|---|---|
कॉन्फ़िगरेशन शैली | अनिवार्य (पायथन कोड) | घोषणात्मक (TOML) |
बिल्ड सिस्टम | निहित (Setuptools) | स्पष्ट ([build-system] में निर्दिष्ट) |
सुरक्षा | संभावित रूप से कम सुरक्षित (गतिशील निष्पादन) | अधिक सुरक्षित (स्थिर कॉन्फ़िगरेशन) |
निर्भरता प्रबंधन | बुनियादी (install_requires ) |
उन्नत (पोएट्री, पिपेनव के साथ एकीकरण) |
उपकरण | पारंपरिक (Setuptools) | आधुनिक (पोएट्री, पिपेनव, फ्लिट) |
लचीलापन | उच्च | मध्यम |
जटिलता | जटिल परियोजनाओं के लिए उच्च हो सकता है | आमतौर पर कम |
माइग्रेशन रणनीतियाँ: Setup.py से Pyproject.toml में
setup.py
से pyproject.toml
में माइग्रेट करना कठिन लग सकता है, लेकिन यह दीर्घकालिक रखरखाव और स्थिरता के लिए एक सार्थक निवेश है। यहाँ कुछ रणनीतियाँ दी गई हैं जिनका आप उपयोग कर सकते हैं:
1. एक न्यूनतम Pyproject.toml से शुरुआत करें
एक बुनियादी pyproject.toml
फ़ाइल बनाएँ जो बिल्ड सिस्टम को निर्दिष्ट करती है और फिर धीरे-धीरे setup.py
से pyproject.toml
में मेटाडेटा को माइग्रेट करें।
2. Pyproject.toml के साथ Setuptools का उपयोग करें
अपने बिल्ड सिस्टम के रूप में Setuptools का उपयोग जारी रखें, लेकिन pyproject.toml
में प्रोजेक्ट मेटाडेटा को परिभाषित करें। यह आपको एक परिचित उपकरण का उपयोग करते हुए भी pyproject.toml
के लाभों का लाभ उठाने की अनुमति देता है।
3. Poetry जैसे आधुनिक उपकरण में माइग्रेट करें
Poetry या Pipenv जैसे आधुनिक उपकरण में माइग्रेट करने पर विचार करें। ये उपकरण व्यापक निर्भरता प्रबंधन सुविधाएँ प्रदान करते हैं और pyproject.toml
के साथ निर्बाध रूप से एकीकृत होते हैं।
उदाहरण: Poetry में माइग्रेट करना
- Poetry स्थापित करें:
pip install poetry
- अपने प्रोजेक्ट में Poetry को इनिशियलाइज़ करें:
poetry init
(यहpyproject.toml
फ़ाइल बनाने में आपका मार्गदर्शन करेगा) - अपनी निर्भरताएँ जोड़ें:
poetry add requests
(या कोई अन्य निर्भरताएँ) - अपना पैकेज बनाएँ:
poetry build
4. स्वचालित माइग्रेशन के लिए उपकरणों का उपयोग करें
कुछ उपकरण माइग्रेशन प्रक्रिया को स्वचालित करने में मदद कर सकते हैं। उदाहरण के लिए, आप अपनी setup.py
फ़ाइल को pyproject.toml
फ़ाइल में बदलने के लिए उपकरणों का उपयोग कर सकते हैं।
पायथन पैकेज प्रबंधन के लिए सर्वोत्तम अभ्यास
1. एक वर्चुअल वातावरण का उपयोग करें
अपने प्रोजेक्ट की निर्भरताओं को सिस्टम-व्यापी पायथन स्थापना से अलग करने के लिए हमेशा एक वर्चुअल वातावरण का उपयोग करें। यह संघर्षों को रोकता है और यह सुनिश्चित करता है कि आपके प्रोजेक्ट में सही निर्भरताएँ हैं।
venv
का उपयोग करके उदाहरण:
conda
का उपयोग करके उदाहरण:
2. निर्भरताओं को सटीक रूप से निर्दिष्ट करें
अपनी निर्भरताओं के संगत संस्करणों को निर्दिष्ट करने के लिए संस्करण बाधाओं का उपयोग करें। यह असंगत लाइब्रेरी अपडेट के कारण होने वाले अप्रत्याशित व्यवहार को रोकता है। अपनी निर्भरताओं को प्रबंधित करने के लिए pip-tools
जैसे उपकरणों का उपयोग करें।
उदाहरण निर्भरता विनिर्देश:
``` requests >= 2.20.0, < 3.0.0 ```3. एक सुसंगत बिल्ड सिस्टम का उपयोग करें
एक बिल्ड सिस्टम (जैसे, Setuptools, Poetry, Flit) चुनें और उसके साथ बने रहें। यह विभिन्न वातावरणों में लगातार बिल्ड सुनिश्चित करता है और पैकेजिंग प्रक्रिया को सरल बनाता है।
4. अपने पैकेज का दस्तावेजीकरण करें
अपने पैकेज के लिए स्पष्ट और संक्षिप्त दस्तावेज़ लिखें। यह उपयोगकर्ताओं को यह समझने में मदद करता है कि आपके पैकेज का उपयोग कैसे करें और दूसरों के लिए आपके प्रोजेक्ट में योगदान करना आसान बनाता है। अपने कोड से दस्तावेज़ उत्पन्न करने के लिए स्फिंक्स जैसे उपकरणों का उपयोग करें।
5. निरंतर एकीकरण (CI) का उपयोग करें
जब भी आपके कोड में परिवर्तन किए जाते हैं तो स्वचालित रूप से अपने पैकेज को बनाने, परीक्षण करने और तैनात करने के लिए एक CI सिस्टम (जैसे, GitHub Actions, Travis CI, GitLab CI) स्थापित करें। यह सुनिश्चित करने में मदद करता है कि आपका पैकेज हमेशा एक कार्यशील स्थिति में है।
उदाहरण GitHub Actions कॉन्फ़िगरेशन:
```yaml name: पायथन पैकेज on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: पायथन 3.9 स्थापित करें uses: actions/setup-python@v4 with: python-version: 3.9 - name: निर्भरताएँ स्थापित करें run: | python -m pip install --upgrade pip pip install poetry poetry install - name: flake8 के साथ लिंट करें run: | poetry run flake8 . - name: pytest के साथ परीक्षण करें run: | poetry run pytest ```6. अपने पैकेज को PyPI पर प्रकाशित करें
अपने पैकेज को पायथन पैकेज इंडेक्स (PyPI) पर प्रकाशित करके दुनिया के साथ साझा करें। इससे दूसरों के लिए आपके पैकेज को स्थापित करना और उपयोग करना आसान हो जाता है।
PyPI पर प्रकाशित करने के चरण:
- PyPI और TestPyPI पर एक खाता पंजीकृत करें।
twine
स्थापित करें:pip install twine
।- अपना पैकेज बनाएँ:
poetry build
याpython setup.py sdist bdist_wheel
। - TestPyPI पर अपना पैकेज अपलोड करें:
twine upload --repository testpypi dist/*
। - PyPI पर अपना पैकेज अपलोड करें:
twine upload dist/*
।
वास्तविक दुनिया के उदाहरण
आइए देखें कि कुछ लोकप्रिय पायथन प्रोजेक्ट pyproject.toml
का उपयोग कैसे कर रहे हैं:
- Poetry: अपने स्वयं के पैकेज प्रबंधन के लिए
pyproject.toml
का उपयोग करता है। - Black: समझौता न करने वाला कोड फ़ॉर्मेटर भी
pyproject.toml
का उपयोग करता है। - FastAPI: पायथन के साथ API बनाने के लिए एक आधुनिक, तेज़ (उच्च-प्रदर्शन), वेब फ्रेमवर्क भी इसका उपयोग करता है।
निष्कर्ष
pyproject.toml
पायथन पैकेज प्रबंधन के लिए आधुनिक मानक का प्रतिनिधित्व करता है, जो आपके पैकेज मेटाडेटा को परिभाषित करने और निर्भरताओं को प्रबंधित करने का एक घोषणात्मक और सुरक्षित तरीका प्रदान करता है। जबकि setup.py
ने हमारी अच्छी सेवा की है, pyproject.toml
में माइग्रेट करना दीर्घकालिक रखरखाव, स्थिरता और आधुनिक उपकरणों के साथ एकीकरण के लिए एक सार्थक निवेश है। सर्वोत्तम प्रथाओं को अपनाकर और सही उपकरणों का उपयोग करके, आप अपनी पायथन पैकेजिंग वर्कफ़्लो को सुव्यवस्थित कर सकते हैं और उच्च-गुणवत्ता वाले, पुन: प्रयोज्य पैकेज बना सकते हैं।